Definicion de variables para simular el Vt que varia sobre una oblea
In [1]:
from IPython.core.display import Image, display
display(Image(url='images/TipicalValuesLongChannel.png'))
Variacion por cuadro de Vt del 0.0004%
In [2]:
%matplotlib inline
import math
import numpy as np
import scipy as sp
import matplotlib.pyplot as plt
import pylab as plb
def matrix(m_length,m_width):
"Return matrix with no homogeneus resitivity"
m = np.zeros((m_length,m_width))
return m
Material_length=963e-6
scmos_process = 3.e-6
wafer_thickness = 0.05e-6
Vt_n_base = 800e-3
Vt_p_base = 900e-3
size_m = Material_length/scmos_process
delta_Vt=0.32e-3
plt.style.use('ggplot')
Matriz de Vt ideal Vt_n_Ideal
In [3]:
Vt_n_Ideal = matrix(int(size_m),int(size_m))
for i in range(0,int(math.sqrt(Vt_n_Ideal.size))):
for j in range(0,int(math.sqrt(Vt_n_Ideal.size))):
Vt_n_Ideal[i][j]= Vt_n_base
plt.matshow(Vt_n_Ideal)
plt.show()
Matriz de Vt ideal Vt_p_Ideal
In [4]:
Vt_p_Ideal = matrix(int(size_m),int(size_m))
for i in range(0,int(math.sqrt(Vt_p_Ideal.size))):
for j in range(0,int(math.sqrt(Vt_p_Ideal.size))):
Vt_p_Ideal[i][j]= Vt_p_base
plt.matshow(Vt_p_Ideal)
plt.show()
OPCION 1 Creacion de las matrices del material con variaciones en Vt_n y Vt_p a partir de la esquina
In [5]:
Vt_n = matrix(int(size_m),int(size_m))
def set_corner_Vt_n():
for i in range(0,int(math.sqrt(Vt_n.size))):
for j in range(0,int(math.sqrt(Vt_n.size))):
Vt_n[i][j]= Vt_n_base+(i+j)*delta_Vt
set_corner_Vt_n()
plt.matshow(Vt_n)
plt.show()
In [6]:
Vt_p = matrix(int(size_m),int(size_m))
def set_corner_Vt_p():
for i in range(0,int(math.sqrt(Vt_p.size))):
for j in range(0,int(math.sqrt(Vt_p.size))):
Vt_p[i][j]= Vt_p_base+(i+j)*delta_Vt
set_corner_Vt_p()
plt.matshow(Vt_p)
plt.show()
OPCION 2 Creacion de las matrices del material con variaciones en Vt_n y Vt_p del centro hacia afuera
In [7]:
Vt_n = matrix(int(size_m),int(size_m))
def centroid_Vt_n(center,i,j):
"Return a value of Vt_n for a single shape"
difJ=abs(center-j)
difI=abs(center-i)
xy=0
if difJ > difI:
xy=difJ
else:
xy=difI
Vtn= Vt_n_base+(xy)*delta_Vt
return Vtn
def set_centroid_Vt_n():
for i in range(0,int(math.sqrt(Vt_n.size))):
for j in range(0,int(math.sqrt(Vt_n.size))):
Vt_n[i][j]= centroid_Vt_n((int(math.sqrt(Vt_n.size))-1)/2,i,j)
set_centroid_Vt_n()
plt.matshow(Vt_n)
plt.show()
In [8]:
Vt_p = matrix(int(size_m),int(size_m))
def centroid_Vt_p(center,i,j):
"Return a value of Vt_p for a single shape"
difJ=abs(center-j)
difI=abs(center-i)
xy=0
if difJ > difI:
xy=difJ
else:
xy=difI
Vtp= Vt_p_base+(xy)*delta_Vt
return Vtp
def set_centroid_Vt_p():
for i in range(0,int(math.sqrt(Vt_p.size))):
for j in range(0,int(math.sqrt(Vt_p.size))):
Vt_p[i][j]= centroid_Vt_p((int(math.sqrt(Vt_p.size))-1)/2,i,j)
set_centroid_Vt_p()
plt.matshow(Vt_p)
plt.show()
Inicializando la matriz de dibujo en el material
In [9]:
paint_matrix = matrix(int(size_m),int(size_m))
plt.matshow(paint_matrix)
plt.show()
Ingrese las dimensiones LxW de los transistores
In [10]:
display(Image(url='images/WLCMOS.png'))
In [11]:
W_base=2
WTA=60
WTB=60
WTC=60
WTD=60
lenght_active_si_transistor = 6
L=2
In [12]:
display(Image(url='images/Transistor.png'))
print("W_base de 2 unidades")
OPCION 1 de Diseño de los transistores de optimizacion de espacio con centroide comun en la oblea, para usar 2 de esos en la simulacion del espejo de corriente
In [13]:
paint_matrix = matrix(int(size_m),int(size_m))
common_source=9
def opcion1():
M_center=int((int(math.sqrt(paint_matrix.size))-1)/2)
TA = matrix(W_base,int((WTA/W_base+1)*(lenght_active_si_transistor/2)))
for i in range(M_center-2-TA.shape[0],M_center-2):
for j in range(M_center-2-TA.shape[1],M_center-2):
paint_matrix[i][j]=1
TB = matrix(W_base,int((WTB/W_base+1)*(lenght_active_si_transistor/2)))
for i in range(M_center-2-TB.shape[0],M_center-2):
for j in range(M_center+3,TB.shape[1]+M_center+3):
paint_matrix[i][j]=2
TC = matrix(W_base,int((WTC/W_base+1)*(lenght_active_si_transistor/2)))
for i in range(M_center+3,TC.shape[0]+M_center+3):
for j in range(M_center-2-TC.shape[1],M_center-2):
paint_matrix[i][j]=3
TD = matrix(W_base,int((WTD/W_base+1)*(lenght_active_si_transistor/2)))
for i in range(M_center+3,TD.shape[0]+M_center+3):
for j in range(M_center+3,TD.shape[1]+M_center+3):
paint_matrix[i][j]=4
opcion1()
plt.matshow(paint_matrix)
plt.show()
OPCION 2, Diseño de 2 transistores de centroide comun con source compartido (ver imagen). Diseno sugerido de diferentes articulos:
[1] http://class.ece.iastate.edu/vlsi2/docs/Papers%20Done/1999-08-MWSCAS-ML.pdf
[2] http://www.wseas.us/e-library/conferences/2005venice/papers/508-397.pdf
In [14]:
display(Image(url='images/currentmirrorlayout.png'))
print("Diseno propuesto para layout del espejo de corriente")
In [15]:
paint_matrix = matrix(int(size_m),int(size_m))
common_source=9
def opcion2():
M_center=int((int(math.sqrt(paint_matrix.size))-1)/2)
Trasistor_branch_per_side=1
shape_sides=4
Transistor_branches=Trasistor_branch_per_side*shape_sides
branch_W=int(WTA/Transistor_branches)
TSource=matrix(int(2*branch_W+(lenght_active_si_transistor/2)*3),int(2*branch_W+(lenght_active_si_transistor/2)*3))
for i in range(M_center-int(TSource.shape[0]/2),M_center+int(TSource.shape[0]/2)):
for j in range(M_center-int(TSource.shape[0]/2),M_center+int(TSource.shape[0]/2)):
paint_matrix[i][j]=common_source
TA_1 = matrix(branch_W,int(lenght_active_si_transistor))
for i in range(M_center-2-TA_1.shape[0],M_center-2):
for j in range(M_center-TA_1.shape[1]-int(TSource.shape[0]/2),M_center-int(TSource.shape[0]/2)):
paint_matrix[i][j]=4
TA_2 = matrix(branch_W,int(lenght_active_si_transistor))
for i in range(M_center+3,TA_2.shape[0]+M_center+3):
for j in range(M_center+int(TSource.shape[0]/2)-1,TA_2.shape[1]+M_center+int(TSource.shape[0]/2)-1):
paint_matrix[i][j]=4
TA_3 = matrix(branch_W,int(lenght_active_si_transistor))
for i in range(M_center-TA_3.shape[1]-int(TSource.shape[0]/2),M_center-int(TSource.shape[0]/2)):
for j in range(M_center+3,TA_3.shape[0]+M_center+3):
paint_matrix[i][j]=4
TA_4 = matrix(branch_W,int(lenght_active_si_transistor))
for i in range(M_center+int(TSource.shape[0]/2)-1,TA_4.shape[1]+M_center+int(TSource.shape[0]/2)-1):
for j in range(M_center-2-TA_4.shape[0],M_center-2):
paint_matrix[i][j]=4
TB_1 = matrix(branch_W,int(lenght_active_si_transistor))
for i in range(M_center+3,TB_1.shape[0]+M_center+3):
for j in range(M_center-TB_1.shape[1]-int(TSource.shape[0]/2),M_center-int(TSource.shape[0]/2)):
paint_matrix[i][j]=5
TB_2 = matrix(branch_W,int(lenght_active_si_transistor))
for i in range(M_center-2-TB_2.shape[0],M_center-2):
for j in range(M_center+int(TSource.shape[0]/2)-1,TB_2.shape[1]+M_center+int(TSource.shape[0]/2)-1):
paint_matrix[i][j]=5
TB_3 = matrix(branch_W,int(lenght_active_si_transistor))
for i in range(M_center-TB_3.shape[1]-int(TSource.shape[0]/2),M_center-int(TSource.shape[0]/2)):
for j in range(M_center-2-TB_3.shape[0],M_center-2):
paint_matrix[i][j]=5
TB_4 = matrix(branch_W,int(lenght_active_si_transistor))
for i in range(M_center+int(TSource.shape[0]/2)-1,TB_4.shape[1]+M_center+int(TSource.shape[0]/2)-1):
for j in range(M_center+3,TB_4.shape[0]+M_center+3):
paint_matrix[i][j]=5
opcion2()
plt.matshow(paint_matrix)
plt.show()
Calculo del valor promedio de Vt para cada transistor
In [16]:
def prom_Vt_n_for_transistor(transistor_num):
"Return a prom value of Vt_n for a single transistor in the wafer"
Vtn_sum=0
Vtn_found=0
for i in range(0,int(math.sqrt(paint_matrix.size))):
for j in range(0,int(math.sqrt(paint_matrix.size))):
if paint_matrix[i][j] == transistor_num:
Vtn_sum += Vt_n[i][j]
Vtn_found += 1
if paint_matrix[i][j] == common_source:
Vtn_sum += Vt_n[i][j]
Vtn_found += 1
Vtn_prom=Vtn_sum/(Vtn_found)
return Vtn_prom
def prom_Vt_p_for_transistor(transistor_num):
"Return a prom value of Vt_n for a single transistor in the wafer"
Vtp_sum=0
Vtp_found=0
for i in range(0,int(math.sqrt(paint_matrix.size))):
for j in range(0,int(math.sqrt(paint_matrix.size))):
if paint_matrix[i][j] == transistor_num:
Vtp_sum += Vt_p[i][j]
Vtp_found += 1
if paint_matrix[i][j] == common_source:
Vtp_sum += Vt_p[i][j]
Vtp_found += 1
Vtp_prom=Vtp_sum/(Vtp_found)
return Vtp_prom
Con variacion de variacion a partir de la esquina de Vt en la oblea
In [17]:
print("Para la opcion diseno 1: Transistores ahorro de espacio con centroide: \n")
paint_matrix = matrix(int(size_m),int(size_m))
opcion1()
set_corner_Vt_n()
plt.matshow(Vt_n)
plt.show()
plt.matshow(paint_matrix)
plt.show()
Vtn_T1=prom_Vt_n_for_transistor(1)
Vtn_T2=prom_Vt_n_for_transistor(2)
Vtn_T3=prom_Vt_n_for_transistor(3)
Vtn_T4=prom_Vt_n_for_transistor(4)
print("Vt_n Transistor 1: "+str(Vtn_T1))
print("Vt_n Transistor 2: "+str(Vtn_T2))
print("Vt_n Transistor 3: "+str(Vtn_T3))
print("Vt_n Transistor 4: "+str(Vtn_T4))
set_corner_Vt_p()
Vtp_T1=prom_Vt_p_for_transistor(1)
Vtp_T2=prom_Vt_p_for_transistor(2)
Vtp_T3=prom_Vt_p_for_transistor(3)
Vtp_T4=prom_Vt_p_for_transistor(4)
print("Vt_p Transistor 1: "+str(Vtp_T1))
print("Vt_p Transistor 2: "+str(Vtp_T2))
print("Vt_p Transistor 3: "+str(Vtp_T3))
print("Vt_p Transistor 4: "+str(Vtp_T4))
print("Para la opcion diseno 2: Transistores con source comun en centroide: \n")
paint_matrix = matrix(int(size_m),int(size_m))
opcion2()
set_corner_Vt_n()
plt.matshow(Vt_n)
plt.show()
plt.matshow(paint_matrix)
plt.show()
Vtn_T1=prom_Vt_n_for_transistor(4)
Vtn_T2=prom_Vt_n_for_transistor(5)
print("Vt_n Transistor 1: "+str(Vtn_T1))
print("Vt_n Transistor 2: "+str(Vtn_T2))
set_corner_Vt_p()
Vtp_T1=prom_Vt_p_for_transistor(4)
Vtp_T2=prom_Vt_p_for_transistor(5)
print("Vt_p Transistor 1: "+str(Vtp_T1))
print("Vt_p Transistor 2: "+str(Vtp_T2))
Con variacion del centro hacia afuera de Vt en la oblea
In [18]:
print("Para la opcion diseno 1: Transistores ahorro de espacio con centroide: \n")
paint_matrix = matrix(int(size_m),int(size_m))
opcion1()
set_centroid_Vt_n()
plt.matshow(Vt_n)
plt.show()
plt.matshow(paint_matrix)
plt.show()
Vtn_T1=prom_Vt_n_for_transistor(1)
Vtn_T2=prom_Vt_n_for_transistor(2)
Vtn_T3=prom_Vt_n_for_transistor(3)
Vtn_T4=prom_Vt_n_for_transistor(4)
print("Vt_n Transistor 1: "+str(Vtn_T1))
print("Vt_n Transistor 2: "+str(Vtn_T2))
print("Vt_n Transistor 3: "+str(Vtn_T3))
print("Vt_n Transistor 4: "+str(Vtn_T4))
set_centroid_Vt_p()
Vtp_T1=prom_Vt_p_for_transistor(1)
Vtp_T2=prom_Vt_p_for_transistor(2)
Vtp_T3=prom_Vt_p_for_transistor(3)
Vtp_T4=prom_Vt_p_for_transistor(4)
print("Vt_p Transistor 1: "+str(Vtp_T1))
print("Vt_p Transistor 2: "+str(Vtp_T2))
print("Vt_p Transistor 3: "+str(Vtp_T3))
print("Vt_p Transistor 4: "+str(Vtp_T4))
print("Para la opcion diseno 2: Transistores con source comun en centroide: \n")
paint_matrix = matrix(int(size_m),int(size_m))
opcion2()
set_centroid_Vt_n()
plt.matshow(Vt_n)
plt.show()
plt.matshow(paint_matrix)
plt.show()
Vtn_T1=prom_Vt_n_for_transistor(4)
Vtn_T2=prom_Vt_n_for_transistor(5)
print("Vt_n Transistor 1: "+str(Vtn_T1))
print("Vt_n Transistor 2: "+str(Vtn_T2))
set_centroid_Vt_p()
Vtp_T1=prom_Vt_p_for_transistor(4)
Vtp_T2=prom_Vt_p_for_transistor(5)
print("Vt_p Transistor 1: "+str(Vtp_T1))
print("Vt_p Transistor 2: "+str(Vtp_T2))
Circuitos a simular:
In [19]:
display(Image(url='images/espejo_n.png'))
print("Espejo NMOS")
In [20]:
display(Image(url='images/espejo_p.png'))
print("Espejo PMOS")
Funcion para editar los archivo de simulacion del espejo NMOS 'espejoNmosPythonFile.cir' y el espejo P 'espejoPmosPythonFile.cir'
In [21]:
import sys
import fileinput
def modificar_cir_Espejo_NMOS(W,L,Vt_T1,Vt_T2):
text="* Simulación Circuito Espejo de Corriente con Ncmos, valores reales de Kp_n y Vt"+"\n"+ \
"* Universidad Nacional de Colombia 2016"+"\n"+ \
"* CMOS Analógico"+"\n"+ \
"* Grupo Jorge Garzón, Esteban Iafrancesco A"+"\n"+ \
"\n"+\
"VDD VDD 0 DC 10 AC 0"+"\n"+\
"V2 VR 0 DC 10 AC 0"+"\n"+\
"VRD RDN VR DC 0 AC 0"+"\n"+\
"RD RDN DRAIN 1000"+"\n"+\
"RP VDD GATE 2000"+"\n"+\
"M1 DRAIN GATE 0 0 nmosideal W="+str(W)+" L="+str(L)+"\n"+\
"M2 GATE GATE 0 0 nmosideal W="+str(W)+" L="+str(L)+"\n"+\
"\n"+\
"VRD2 RDN2 VR DC 0 AC 0"+"\n"+\
"RD2 RDN2 DRAIN2 1000"+"\n"+\
"RP2 VDD GATE2 2000"+"\n"+\
"M3 DRAIN2 GATE2 0 0 nmos1 W="+str(W)+" L="+str(L)+"\n"+\
"M4 GATE2 GATE2 0 0 nmos2 W="+str(W)+" L="+str(L)+"\n"+\
"\n"+\
".model nmosideal nmos LEVEL=1 Vto=0.8 KP=120u LAMBDA=0.01 U0=650"+"\n"+\
".model nmos1 nmos LEVEL=1 Vto="+str(Vt_T1)+" KP=120u LAMBDA=0.01 U0=650"+"\n"+\
".model nmos2 nmos LEVEL=1 Vto="+str(Vt_T2)+" KP=120u LAMBDA=0.01 U0=650"+"\n"+\
"\n"+\
".control"+"\n"+\
"set color0 =white"+"\n"+\
"set color1=black"+"\n"+\
"op"+"\n"+\
"show all"+"\n"+\
"dc vdd 0.7 12 0.01"+"\n"+\
"plot i(vrd) i(vrd2)"+"\n"+\
".endc"+"\n"
for i, line in enumerate(fileinput.input('../spice-simulations/espejoNmosPythonFile.cir', inplace=1)):
if i == 1: sys.stdout.write(text) # replace 'sit' and write
fileinput.close()
def modificar_cir_Espejo_PMOS(W,L,Vt_T1,Vt_T2):
text="* Simulación Circuito Espejo de Corriente con Ncmos, valores reales de Kp_n y Vt"+"\n"+ \
"* Universidad Nacional de Colombia 2016"+"\n"+ \
"* CMOS Analógico"+"\n"+ \
"* Grupo Jorge Garzón, Esteban Iafrancesco A"+"\n"+ \
"\n"+\
"VDD VDD 0 DC -10 AC 0"+"\n"+\
"V2 VR 0 DC -10 AC 0"+"\n"+\
"VRD RDN VR DC 0 AC 0"+"\n"+\
"RD RDN DRAIN 1000"+"\n"+\
"RP VDD GATE 2000"+"\n"+\
"M1 DRAIN GATE 0 0 pmosideal W="+str(W)+" L="+str(L)+"\n"+\
"M2 GATE GATE 0 0 pmosideal W="+str(W)+" L="+str(L)+"\n"+\
"\n"+\
"VRD2 RDN2 VR DC 0 AC 0"+"\n"+\
"RD2 RDN2 DRAIN2 1000"+"\n"+\
"RP2 VDD GATE2 2000"+"\n"+\
"M3 DRAIN2 GATE2 0 0 pmos1 W="+str(W)+" L="+str(L)+"\n"+\
"M4 GATE2 GATE2 0 0 pmos2 W="+str(W)+" L="+str(L)+"\n"+\
"\n"+\
".model pmosideal pmos LEVEL=1 Vto=-0.9 KP=40u LAMBDA=0.0125 U0=250"+"\n"+\
".model pmos1 pmos LEVEL=1 Vto=-"+str(Vt_T1)+" KP=40u LAMBDA=0.0125 U0=250"+"\n"+\
".model pmos2 pmos LEVEL=1 Vto=-"+str(Vt_T2)+" KP=40u LAMBDA=0.0125 U0=250"+"\n"+\
"\n"+\
".control"+"\n"+\
"set color0 =white"+"\n"+\
"set color1=black"+"\n"+\
"op"+"\n"+\
"show all"+"\n"+\
"dc vdd -0.8 -12 -0.01"+"\n"+\
"plot i(vrd) i(vrd2)"+"\n"+\
".endc"+"\n"
for i, line in enumerate(fileinput.input('../spice-simulations/espejoPmosPythonFile.cir', inplace=1)):
if i == 1: sys.stdout.write(text) # replace 'sit' and write
fileinput.close()
Simulacion con variacion desde el centro de Vt_n en la oblea y centroide comun entre 2 transistores (de los 4 disponibles) para formar el espejo de corriente.
In [22]:
paint_matrix = matrix(int(size_m),int(size_m))
opcion1()
set_corner_Vt_n()
plt.matshow(Vt_n)
plt.show()
plt.matshow(paint_matrix)
plt.show()
Vtn_T1=prom_Vt_n_for_transistor(1)
Vtn_T2=prom_Vt_n_for_transistor(2)
Vtn_T3=prom_Vt_n_for_transistor(3)
Vtn_T4=prom_Vt_n_for_transistor(4)
#modificar_cir_Espejo_NMOS(WTA,L,Vtn_T1,Vtn_T2)
In [23]:
display(Image(url='images/corner_Vt_TA_TB_n.png'))
print("VDD vs -Iout. Rojo Espejo ideal, Azul Espejo Con variaciones en Vt_n de la oblea. Transistores TA y TB")
In [24]:
#modificar_cir_Espejo_NMOS(WTA,L,Vtn_T1,Vtn_T3)
In [25]:
display(Image(url='images/corner_Vt_TA_TC_n.png'))
print("VDD vs -Iout. Rojo Espejo ideal, Azul Espejo Con variaciones en Vt_n de la oblea. Transistores TA y TC")
In [26]:
#modificar_cir_Espejo_NMOS(WTA,L,Vtn_T2,Vtn_T3)
In [27]:
display(Image(url='images/corner_Vt_TB_TC_n.png'))
print("VDD vs -Iout. Rojo Espejo ideal, Azul Espejo Con variaciones en Vt_n de la oblea. Transistores TB y TC")
Simulacion con variacion desde el centro de Vt_n en la oblea y centroide comun entre 2 transistores (de los 4 disponibles) para formar el espejo de corriente.
In [28]:
paint_matrix = matrix(int(size_m),int(size_m))
opcion1()
set_centroid_Vt_n()
plt.matshow(Vt_n)
plt.show()
plt.matshow(paint_matrix)
plt.show()
Vtn_T1=prom_Vt_n_for_transistor(1)
Vtn_T2=prom_Vt_n_for_transistor(2)
Vtn_T3=prom_Vt_n_for_transistor(3)
Vtn_T4=prom_Vt_n_for_transistor(4)
#modificar_cir_Espejo_NMOS(WTA,L,Vtn_T1,Vtn_T2)
In [29]:
display(Image(url='images/centroid_Vt_TA_TB_n.png'))
print("VDD vs -Iout. Rojo Espejo ideal, Azul Espejo Con variaciones en Vt_n de la oblea. Transistores TA y TB")
In [30]:
#modificar_cir_Espejo_NMOS(WTA,L,Vtn_T2,Vtn_T3)
In [31]:
display(Image(url='images/centroid_Vt_TB_TC_n.png'))
print("VDD vs -Iout. Rojo Espejo ideal, Azul Espejo Con variaciones en Vt_n de la oblea. Transistores TB y TC")
Simulacion con variacion desde la esquina de Vt_n en la oblea y diseno 2 de surce compartido, centroide comun entre 2 transistores para formar el espejo de corriente.
In [32]:
paint_matrix = matrix(int(size_m),int(size_m))
opcion2()
set_corner_Vt_n()
plt.matshow(Vt_n)
plt.show()
plt.matshow(paint_matrix)
plt.show()
Vtn_T1=prom_Vt_n_for_transistor(4)
Vtn_T2=prom_Vt_n_for_transistor(5)
#modificar_cir_Espejo_NMOS(WTA,L,Vtn_T1,Vtn_T2)
In [33]:
display(Image(url='images/corner_Vt_CS_n.png'))
print("VDD vs -Iout. Rojo Espejo ideal, Azul Espejo Con variaciones en Vt_n de la oblea. Diseno de source compartido")
Simulacion con variacion desde el centro de Vt_n en la oblea y diseno 2 de surce compartido, centroide comun entre 2 transistores para formar el espejo de corriente.
In [34]:
paint_matrix = matrix(int(size_m),int(size_m))
opcion2()
set_centroid_Vt_n()
plt.matshow(Vt_n)
plt.show()
plt.matshow(paint_matrix)
plt.show()
Vtn_T1=prom_Vt_n_for_transistor(4)
Vtn_T2=prom_Vt_n_for_transistor(5)
#modificar_cir_Espejo_NMOS(WTA,L,Vtn_T1,Vtn_T2)
In [35]:
display(Image(url='images/center_Vt_CS_n.png'))
print("VDD vs -Iout. Rojo Espejo ideal, Azul Espejo Con variaciones en Vt_n de la oblea. Diseno de source compartido")
Simulacion con variacion desde la esquina de Vt_p en la oblea y centroide comun entre 2 transistores (de los 4 disponibles) para formar el espejo de corriente.
In [36]:
paint_matrix = matrix(int(size_m),int(size_m))
opcion1()
set_corner_Vt_p()
plt.matshow(Vt_p)
plt.show()
plt.matshow(paint_matrix)
plt.show()
Vtp_T1=prom_Vt_p_for_transistor(1)
Vtp_T2=prom_Vt_p_for_transistor(2)
Vtp_T3=prom_Vt_p_for_transistor(3)
Vtp_T4=prom_Vt_p_for_transistor(4)
#modificar_cir_Espejo_PMOS(WTA,L,Vtp_T1,Vtp_T2)
In [37]:
display(Image(url='images/corner_Vt_TA_TB_p.png'))
print("VDD vs -Iout. Rojo Espejo ideal PMOS, Azul Espejo Con variaciones en Vt_p de la oblea. Transistores TA y TB")
In [38]:
#modificar_cir_Espejo_PMOS(WTA,L,Vtp_T1,Vtp_T3)
In [39]:
display(Image(url='images/corner_Vt_TA_TC_p.png'))
print("VDD vs -Iout. Rojo Espejo ideal PMOS, Azul Espejo Con variaciones en Vt_p de la oblea. Transistores TA y TC")
In [40]:
#modificar_cir_Espejo_PMOS(WTA,L,Vtp_T2,Vtp_T3)
In [41]:
display(Image(url='images/corner_Vt_TB_TC_p.png'))
print("VDD vs -Iout. Rojo Espejo ideal PMOS, Azul Espejo Con variaciones en Vt_p de la oblea. Transistores TB y TC")
Simulacion con variacion desde el centro de Vt_p en la oblea y centroide comun entre 2 transistores (de los 4 disponibles) para formar el espejo de corriente.
In [42]:
paint_matrix = matrix(int(size_m),int(size_m))
opcion1()
set_centroid_Vt_p()
plt.matshow(Vt_p)
plt.show()
plt.matshow(paint_matrix)
plt.show()
Vtp_T1=prom_Vt_p_for_transistor(1)
Vtp_T2=prom_Vt_p_for_transistor(2)
Vtp_T3=prom_Vt_p_for_transistor(3)
Vtp_T4=prom_Vt_p_for_transistor(4)
#modificar_cir_Espejo_PMOS(WTA,L,Vtp_T1,Vtp_T2)
In [43]:
display(Image(url='images/center_Vt_LS_p.png'))
print("VDD vs -Iout. Rojo Espejo ideal, Azul Espejo Con variaciones en Vt_p de la oblea. Transistores TA y TB")
Simulacion con variacion desde la esquina de Vt_p en la oblea y diseno 2 de surce compartido, centroide comun entre 2 transistores para formar el espejo de corriente.
In [44]:
paint_matrix = matrix(int(size_m),int(size_m))
opcion2()
set_corner_Vt_p()
plt.matshow(Vt_p)
plt.show()
plt.matshow(paint_matrix)
plt.show()
Vtp_T1=prom_Vt_p_for_transistor(4)
Vtp_T2=prom_Vt_p_for_transistor(5)
#modificar_cir_Espejo_PMOS(WTA,L,Vtp_T1,Vtp_T2)
In [45]:
display(Image(url='images/corner_Vt_CS_p.png'))
print("VDD vs -Iout. Rojo Espejo ideal, Azul Espejo Con variaciones en Vt_p de la oblea. Diseno de source compartido")
Simulacion con variacion desde el centro de Vt_p en la oblea y diseno 2 de surce compartido, centroide comun entre 2 transistores para formar el espejo de corriente.
In [46]:
paint_matrix = matrix(int(size_m),int(size_m))
opcion2()
set_centroid_Vt_p()
plt.matshow(Vt_p)
plt.show()
plt.matshow(paint_matrix)
plt.show()
Vtp_T1=prom_Vt_p_for_transistor(4)
Vtp_T2=prom_Vt_p_for_transistor(5)
#modificar_cir_Espejo_PMOS(WTA,L,Vtp_T1,Vtp_T2)
In [47]:
display(Image(url='images/center_Vt_CS_p.png'))
print("VDD vs -Iout. Rojo Espejo ideal, Azul Espejo Con variaciones en KP_p de la oblea. Diseno de source compartido")
[1] Los transistores tipo NPN son mas suceptibles a las variaciones de Vt sobre la oblea que los transistores NPN, debido que los valores tipicos son mas bajos en los primeros.
[2] La configuracion de diseno 1 de ahorro de espacio en el CI y centroide comun en el centro de la oblea para los transistores tiene buen matching de dos transistores solo cuando el Vt varia del centro hacia afuera de la oblea.
[3] La configuracion de diseno 2 de source compartido y centroide comun en el centro de la oblea tiene las mejores caracteristicas de matchig entre 2 transistores, tanto para variaciones desde la esquina de la oblea como para las variaciones desde el centro.
[4]Asumiendo variaciones desde el centro de la oblea, y diseno 2 de source compartido, el matchig es el mejor y la desviacion con el valor ideal de Vt tambien, lo cual resulta en que el espejo NPN y el PNP se comporten muy parecido a los espejos ideales.
[5] Los espejos de corriente simulados con transistores NPN presentaron una mayor desviacion del comportamiento ideal del espejo de corriente por lo mencionado en el numeral [1], aunque menos significativa que la deferencia presentada con la transconductancia.